Направо към съдържанието

Назъбен масив

от Уикипедия, свободната енциклопедия
Memory layout of a jagged array.

В програмирането назъбен масив (на английски: Jagged Array), познат още като нащърбен масив, е масив от масиви чиито елементи могат да бъдат с различна дължина.[1] При визуализиране на такъв масив, той получава назъбен вид, откъдето идва името. За разлика от назъбения масив, в езиците като C, двуизмерните масиви са винаги правоъгълни, т.е. елементите им са с равна дължина.[2]

Назъбеният масив представлява двуизмерен масив, като първоначално се декларира дължината му, т.е. колко масиви ще се съдържат като елементи на назъбения масив. След това всеки елемент се декларира като масив поотделно със съответната дължина.

В някои езици, като C#, е възможно смесване на назъбени и многомерни масиви, т.е. един назъбен масив може да съдържа като елементи двуизмерни масиви с различна дължина.[3]

Масиви от масиви в езици като Java, Python (многомерни списъци), Ruby, Visual Basic.NET, Perl, PHP, JavaScript, Objective-C, Swift, и Atlas Autocode се имплементират като Iliffe vectors.

Назъбен масив в .NET Framework

[редактиране | редактиране на кода]

В .NET Framework назъбеният масив представлява масив от масиви т.е. всеки негов ред на практика е масив, който може да има различна дължина от останалите в назъбения масив, но не може да има различна размерност.

Особено при декларирането му е, че няма една двойка скоби, както при обикновените масиви, а имаме вече две двойки такива.

Възможно е декларирането, заделянето и инициализацията на един масив от масиви да се извършва в един израз

int[][] myJaggedArray = {
    new int[] {1,3,5,7,9},
    new int[] {2,4,6},
    new int[] {3,12,57,56,58}
};

Инициализиране и достъп до елементите

[редактиране | редактиране на кода]

Достъпът до елементите на масивите, които са част от назъбения е по индекс. Интересно е, че елементи на назъбения масив може да са не само едномерни масиви, но и многомерни такива.

int[][,] jaggedOfMulti = new int[3][,];
jaggedOfMulti[0] = new int[,] { {9,27}, {10,20} };

Разположение в паметта

[редактиране | редактиране на кода]

Назъбените масиви съдържат само референции към масивите, а не самите тях. Тъй като не знае каква ще е размерността на всеки от масивите, CLR заделя само референцията за тях. Чак след като се задели памет за някой от масивите елементи на назъбения, тогава се насочва указателя към новосъздадения блок динамична памет.

Производителност (на английски: Computer performance)

[редактиране | редактиране на кода]

Въпреки че инициализацията на назъбен масив отнема повече време, в много случаи, при обхождане, той работи по-ефективно в сравнение със стандартния многомерен масив и спестява ресурси. В специфични ситуации той може да бъде средство за оптимизация на кода.[4]

В C#, назъбени масиви се правят със следния код:[5]

int[][]c;
c=new int[2][]; // creates 2 rows
c[0]=new int[5]; // 5 columns for row 0
c[1]=new int[3]; // create 3 columns for row 1

В Java назъбени масиви се правят по подобен начин, както в C#:[6]

int twoD[][] = new int[4][];
    twoD[0] = new int[1];
    twoD[1] = new int[2];
    twoD[2] = new int[3];
    twoD[3] = new int[4];

В C++/CLI, назъбени масиви могат да бъдат направени така:[7]

using namespace System;
int main()
{
array<array<double> ^> ^ Arrayname = gcnew array <array<double> ^> (4);// array contains 4
//elements
return 0;
}

В VB.NET назъбени масиви се правят така:[8]

Dim all_values()() As Integer = { _
    New Integer() {1, 2, 3}, _
    New Integer() {4, 5} _
}

В Python, назъбените масиви не са имплементирани, но могат да бъдат симулирани със списъци (на английски: List), за да се създаде многомерен списък, който поддържа различни многомерни матрици.

multi_list_3d = [[[] for i in range(3)] for i in range(3)] # [[[], [], []], ], [], [, ], [], []
multi_list_5d = [[[] for i in range(5)] for i in range(5)] # [[[], [], [], [], []], ], [], [], [], [, ], [], [], [], [, ], [], [], [], [, ], [], [], [], []

Визуализация на Триъгълник на Паскал с назъбен масив

[редактиране | редактиране на кода]
classPascalTriangle
{
      static void Main()
      {
            const int HEIGHT = 12;
 
            // Allocate the array in a triangle form
            long[][] triangle = new long[HEIGHT + 1][];
 
            for (int row = 0; row < HEIGHT; row++)
            {
                  triangle[row] = new long[row + 1];
            }
 
            // Calculate the Pascal's triangle
            triangle[0][0] = 1;
            for (int row = 0; row < HEIGHT  1; row++)
            {
                  for (int col = 0; col <= row; col++)
                  {
                        triangle[row + 1][col] += triangle[row][col];
                        triangle[row + 1][col + 1] += triangle[row][col];
                  }
            }
 
            // Print the Pascal's triangle
            for (int row = 0; row < HEIGHT; row++)
            {
                  Console.Write("".PadLeft((HEIGHT  row) * 2));
                  for (int col = 0; col <= row; col++)
                  {
                        Console.Write("{0,3} ", triangle[row][col]);
                  }
                  Console.WriteLine();
            }
      }
}
  1. Learning C# 3.0. "O'Reilly Media, Inc.", 21 април 2016. ISBN 978-0-596-55420-0. с. 210–.
  2. Don Box. Essential .Net: The Common Language Runtime. Addison-Wesley Professional, 2002. ISBN 978-0-201-73411-9. с. 138.
  3. Jagged Arrays (C# Programming Guide) // 26 април 2016.
  4. Jagged Arrays and Performance in .Net // Посетен на 27 април 2016.
  5. C# 2008 for Programmers. Pearson Education, 26 септември 2008. ISBN 978-0-13-701188-9. с. 40.
  6. Jagged array // Посетен на 25 април 2016.
  7. Jagged Arrays // FunctionX. Посетен на 21 април 2016.
  8. Declare jagged arrays in VB.NET // Посетен на 27 април 2016.
  Тази страница частично или изцяло представлява превод на страницата Jagged array в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс – Признание – Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година – от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница, за да видите списъка на съавторите. ​

ВАЖНО: Този шаблон се отнася единствено до авторските права върху съдържанието на статията. Добавянето му не отменя изискването да се посочват конкретни източници на твърденията, които да бъдат благонадеждни.​